/*
 * @Author: 数组 array
 * @Date: 2021-01-21 17:30:14
 * @LastEditTime: 2021-01-21 18:02:26
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \go_demo\src\07_array\main.go
 */
package main

import "fmt"

func main () {
    /*
    值类型:改变变量副本值的时候,不会改变变量本身的值
    引用类型:改变变量副本值的时候,会改变变量本身的值
    
    基础数据类型 和 数组 都是值类型
    切片是引用类型
    
    数组是指一系列同一类型数据的集合 数组中包含的每个数据被称为数组元素(element),这种类型可以是任意的原始类型,比如int, string等,也可以是用户自定义的类型。一个数组包含的元素个数被称为数组的长度。在Golang中数组是一个长度固定的数据类型,数组的长度是类型的一部分,也就是说[5]int和[10]int是两个不同的类型。Golang中数组的另一个特点是占用内存的连续性,也就是说数组中的元素是被分配到连续的内存地址中的,因而索引数组元素的速度非常快。
    和数组对应的类型是Slice (切片) , Slice是可以增长和收缩的动态序列,功能也更灵活,但是想要理解slice工作原理的话需要先理解数组,所以本节主要为大家讲解数组的使用。

    var 数组变量名 [元素数量] 类型
    定义一个长度为3元素类型为int的数组a
    var a [3]int

    定义一个长度为3元素类型为int的数组b
    var b [3]int
    b[0] = 1
    b[1] = 2
    b[2] = 3
    */

    var strArr [3] string
    strArr[0] = "php"
    strArr[1] = "java"
    strArr[2] = "golang"
    // strArr[3] = "js" //数组的长度也是类型的一部分，此时会报错
    fmt.Println(strArr)

    //声明并赋值数组
    var arr1 = [3]int { 10 , 20 , 30}
    fmt.Println(arr1)

    //声明键值
    arr2 := [...]int{ 1:1,2:3,4:6}  //输出[0 1 3 0 6]
    fmt.Println(arr2)

    //按照上面的方法每次都要确保提供的初始值和数组长度一致,一股情况下我们可以让编译器根据初始值的个数自行推断数组的长 例如：
    var testArr = [...]int { 1, 2}
    fmt.Println(testArr)

    // len()可以打印数组长度
    fmt.Println(len(testArr))

    /*
    多维数组
    */

    //二维数组声明
    var arr3 = [...][2] string {
        {"北京","上海"},
        {"广州","深圳"},
        {"成都","重庆"},
    }

    fmt.Println(arr3)
}